#!/bin/bash

#-------------------------------------------------------------------------------
# Installation return codes are:
#
# 0 - no error
# 10 - usage error
# 20 - invalid/non-existent directory on HMC
# 30 - install file not found
# 40 - RPM test verify install error
# 50 - RPM install error
# 60 - 'tar' command failure
#
# Except for call rpm command to query, all calls to rpm must go
# go through dorpm, eraserpm etc..
#
# *The actual value returned will be 1x, 2x, etc, where x will be either 0 or 4
# which is based on any RPM un-install errors.. or, '0' if successful completion
#-------------------------------------------------------------------------------

#-------------------------------------------------------------------------------
# Initialize script return code, log file name
#-------------------------------------------------------------------------------
exitRC=0
LogFile=/tmp/HmcInstall.log

#-------------------------------------------------------------------------------
# Common exit point
#-------------------------------------------------------------------------------
exit_cleanup() {
    # keep the log file, but ensure a different user can overwrite it next time
    chmod 666 $LogFile

    if [ $1 -ne 0 ]; then
        exit $1$exitRC
    else
        exit 0
    fi
}

#-------------------------------------------------------------------------------
# RPM  install
#-------------------------------------------------------------------------------
dorpm() {
    if [ -f /opt/hsc/data/config/NO_UPDATE_RPMS ]; then
        x="$2"
        # Strip version then leading directory name
        f=`echo ${x%%-[0-9]*}`
        r=`echo ${f##*/}`
        for i in `cat /opt/hsc/data/config/NO_UPDATE_RPMS`; do
            if [ "$r" = "$i" ]; then
                return
            fi
        done
    fi
     
    # Log the test install output. The format for the "normal" RPM install
    # processing inside this script is 'rpm -i <file spec> --force --nodeps'
    echo "=========================================================" >> $LogFile
    echo "***** Executing rpm -vv $* *****"                          >> $LogFile
    echo "=========================================================" >> $LogFile
    rpm -vv $* >> $LogFile 2>&1
    RC=$?
    return $RC
}

#-------------------------------------------------------------------------------
# RPM erase rpm
#-------------------------------------------------------------------------------
eraserpm() {
    # If rpm is part of no update list then do not do anything with it
    if [ -f /opt/hsc/data/config/NO_UPDATE_RPMS ]; then
        x="$2"
        for i in `cat /opt/hsc/data/config/NO_UPDATE_RPMS`; do
            if [ "$x" = "$i" ]; then
                return
            fi
        done
    fi
    echo "=========================================================" >> $LogFile
    echo "***** Executing rpm -vv $* *****"                          >> $LogFile
    echo "=========================================================" >> $LogFile
    rpm -vv $* >> $LogFile 2>&1
    if [ $? -ne 0 ]; then
        exitRC=4
        echo "error removing rpm fileset named $2" >> $LogFile
    fi
}

#-------------------------------------------------------------------------------
# RPM test install
#-------------------------------------------------------------------------------
testrpm() {
    rpm --test  $1 $2 $3 $4
    return $?
}

#-------------------------------------------------------------------------------
# Start the product install...
#-------------------------------------------------------------------------------
cd /
image=$1

if [ "$image" = "" ]; then
    echo "Please specify directory containing installable packages"
    echo "usage: installImages  <directory>"
    exit_cleanup 1
fi

# Check if directory exists
if [ ! -d $image ]; then
    echo "The directory $patchdir doesn't exist"
    echo "Please specify directory containing the installable packages."
    exit_cleanup 2
fi

if [ -f /opt/hsc/data/config/NO_UPDATE_FILES ]; then
    rm -f /tmp/saved_files.tar
    cat /opt/hsc/data/config/NO_UPDATE_FILES | xargs tar -cvf /tmp/saved_files.tar
fi

PATH=$PATH:/opt/IBMJava/jre/bin:
LD_LIBRARY_PATH=/opt/hsc/lib:/opt/hsc/lib/hcmjni:/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH

if [ ! -d /opt/IBMJava ]; then
    ln -s /opt/IBMJava2-141 /opt/IBMJava
fi

# Save old log file
if [ -f $LogFile ]; then
    mv -f $LogFile ${LogFile}.old
fi

echo "--- Installing Common Console Framework...."
/usr/sbin/groupadd -g 508 ccfw 2>/dev/null
dorpm -e ccfw --nodeps --allmatches
dorpm -ivh $image/baseHMC/ccfw*.rpm --force --nodeps
/usr/sbin/useradd -c "Common Console Framework" -M -g ccfw -d /opt/ccfw ccfw

# Installing RMC and CSM
echo "--- Installing RSCT packages...."
rpm -q src 1>&2 2>/dev/null
if [ $? -eq 0 ]; then
    dorpm -Uvh $image/rmc/src-*rpm --force --nodeps
else
    dorpm -ivh $image/rmc/src-*rpm --force --nodeps
fi
# Ensure src is started

rpm -q rsct.core.utils 1>&2 2>/dev/null
if [ $? -eq 0 ]; then
    dorpm -Uvh $image/rmc/rsct.core.utils-*rpm --force --nodeps
else
    dorpm -ivh $image/rmc/rsct.core.utils-*rpm --force --nodeps
fi
rpm -q rsct.core 1>&2 2>/dev/null
if [ $? -eq 0 ]; then
    dorpm -Uvh $image/rmc/rsct.core-*rpm --force --nodeps
else
    dorpm -ivh $image/rmc/rsct.core-*rpm --force --nodeps
fi
rpm -q rsct.service 1>&2 2>/dev/null
if [ $? -eq 0 ]; then
    dorpm -Uvh $image/rmc/rsct.service-*rpm --force --nodeps
else
    dorpm -ivh $image/rmc/rsct.service-*rpm --force --nodeps
fi
rpm -q rsct.basic 1>&2 2>/dev/null
if [ $? -eq 0 ]; then
    dorpm -Uvh $image/rmc/rsct.basic-*rpm --force --nodeps
else
    dorpm -ivh $image/rmc/rsct.basic-*rpm --force --nodeps
fi
echo "--- Installing CSM packages...."
rpm -q csm.core 1>&2 2>/dev/null
if [ $? -eq 0 ]; then
    dorpm -Uvh $image/rmc/csm.core-*rpm --force --nodeps
else
    dorpm -ivh $image/rmc/csm.core-*rpm --force --nodeps
fi
rpm -q csm_hmc.server 1>&2 2>/dev/null
if [ $? -eq 0 ]; then
    dorpm -Uvh $image/rmc/csm_hmc.server-*rpm --force --nodeps
else
    dorpm -ivh $image/rmc/csm_hmc.server-*rpm --force --nodeps
fi
rpm -q csm.server.hsc 1>&2 2>/dev/null
if [ $? -eq 0 ]; then
    dorpm -Uvh $image/rmc/csm.server.hsc-*rpm --force --nodeps
else
    dorpm -ivh $image/rmc/csm.server.hsc-*rpm --force --nodeps
fi
echo "--- Installing LPARCMD packages...."
rpm -q hsc.lparcmd 1>&2 2>/dev/null
if [ $? -eq 0 ]; then
    dorpm -Uvh $image/rmc/hsc.lparcmd*.rpm --force --nodeps
else
    dorpm -ivh $image/rmc/hsc.lparcmd*.rpm --force --nodeps
fi

echo "--- Updating WebSM...."
cd /
rm -f /tmp/_wsm_saved.tar
/bin/tar cf /tmp/_wsm_saved.tar /var/websm/security /usr/websm/codebase/SM* /var/websm/config/user_settings/websm.cfg 2>/dev/null

dorpm -e sysmgt.websm.framework --nodeps
dorpm -ivh $image/websm/sysmgt.websm.framework*.rpm --force --nodeps
dorpm -e sysmgt.websm.webaccess --nodeps
dorpm -ivh $image/websm/sysmgt.websm.webaccess*.rpm --force --nodeps
dorpm -e sysmgt.websm.apps --nodeps
dorpm -ivh $image/websm/sysmgt.websm.apps*.rpm --force --nodeps
dorpm -e sysmgt.websm.security --nodeps

dorpm -ivh $image/websm/sysmgt.websm.security*.rpm --force --nodeps
if [ ! -f /usr/websm/codebase/pluginjars/bundles.jar ]; then
    ln -sf /usr/websm/codebase/bundles.jar /usr/websm/codebase/pluginjars/
fi

dorpm -Uvh $image/baseHMC/IBMhsc.corepe*.rpm --force --nodeps

echo "--- Updating base packages...."
mount /mnt/dos
dorpm -ivh $image/baseOS/hmc-update-GA-2-*.i386.rpm --force --nodeps
if [ $? -eq 0 ]; then
    cd /tmp/mcp-update
    ./post_install.*.sh
    if [ $? -eq 0 ]; then
        cd /
        mv /mnt/dos/linux/vmlinuz /mnt/dos/linux/vmlinux.old
        cp /boot/vmlinuz /mnt/dos/linux/
    fi
fi
umount /mnt/dos
dorpm -Uvh $image/baseOS/opera*rpm --force --nodeps

if [ ! -f /usr/websm/codebase/pluginjars/bundles.jar ]; then
    ln -sf /usr/websm/codebase/bundles.jar /usr/websm/codebase/pluginjars/
fi

echo "--- Installing HMC Help Software..."
dorpm -Uvh $image/baseHMC/IBMhsc.help*.rpm  --force --nodeps

echo "--- Installing HMC packages..."

# Save security information This will get processed in next reboot

sp=`grep ^SocketProvider /opt/hsc/data/cim.properties`
if [[ $sp == *PKCS12SocketProvider ]]; then
    echo $sp > /var/hsc/tmp/cimomcfg.properties.reboot
fi

dorpm -Uvh $image/baseHMC/IBMhsc.bundles_*.rpm --force --nodeps
dorpm -Uvh $image/baseHMC/IBMhsc.lparmgt*.rpm --force --nodeps
dorpm -Uvh $image/baseHMC/IBMhsc.auiml_en_US*.rpm --force --nodeps
dorpm -Uvh $image/baseHMC/IBMhsc.plfmgt*.rpm --force --nodeps
dorpm -Uvh $image/baseHMC/IBMhsc.coreserver*.rpm --force --nodeps
dorpm -Uvh $image/baseHMC/IBMhsc.cimprovider*.rpm --force --nodeps

# Restore settings
/bin/tar -xf /tmp/_wsm_saved.tar
echo "--- Installing netboot packages..."
dorpm -Uvh $image/baseHMC/IBMhsc.netboot*rpm --force --nodeps
dorpm -Uvh $image/baseHMC/nimol*rpm --force --nodeps

if [ -f $image/service/IBMinvscout*rpm ]; then
    echo "--- Installing InventoryScout packages...."
    dorpm -Uvh $image/service/IBMinvscout*rpm --force --nodeps
fi

if [ -d $image/info ]; then
    echo "--- Installing InfoCenter packages...."
    dorpm -e IBMhmc.InfoCenter --nodeps --allmatches
    dorpm -Uvh $image/info/IBMhmc.InfoCenter*rpm --force --nodeps
fi

if [ ! -L /usr/lib/libnetchmcx.so ]; then
    ln -s /usr/lib/libnetc.so /usr/lib/libnetchmcx.so
fi

if [ -f $image/hsc.tar ]; then
    echo "--- Installing miscellaneous updates...." 
    cd /
    tar -xf $image/hsc.tar
    if [ $? -ne 0 ]; then
        exit_cleanup 6
    fi
fi

if [ -f $image/X.tar ]; then
    echo "--- Installing X Server Config...."
    tar -xf $image/X.tar
    if [ $? -ne 0 ]; then
        exit_cleanup 6
    fi
fi

if [ -f $image/websm.tar ]; then
    echo "--- Installing WebSM updates...."
    tar -xf $image/websm.tar
    if [ $? -ne 0 ]; then
        exit_cleanup 6
    fi
fi

if [ -f /opt/hsc/data/config/NO_UPDATE_FILES ]; then
    if [ -f /tmp/saved_files.tar ]; then
        cd /
        tar -xvf /tmp/saved_files.tar
        rm -f /tmp/saved_files.tar
    fi
fi
 
if [ -f $image/postinstall ]; then
    $image/postinstall >> $LogFile 2>&1
fi

if [ -f $image/.VERSION ]; then
    cat $image/.VERSION > /root/.version
    cat $image/.VERSION > /home/hscroot/.version
    chmod 644 /home/hscroot/.version
    chown hscroot.hmc /home/hscroot/.version
fi

# Remove /opt/hsc/data/disablefsplock from GA1 or pre SQ2_0424A_0610 driver
if [ -f /opt/hsc/data/disablefsplock ]; then 
    /bin/rm -f /opt/hsc/data/disablefsplock
fi

if [ ! -f /etc/resolv.conf ]; then 
    touch /etc/resolv.conf
fi

echo "==========================================================" >> $LogFile
echo "*********************** End of Log ***********************" >> $LogFile
echo "==========================================================" >> $LogFile
exit_cleanup 0
